<html>
 <head>
  <meta charset="UTF-8">
 </head>
 <body>
  <h1 data-lake-id="YgG0l" id="YgG0l"><span data-lake-id="u29296134" id="u29296134">典型回答</span></h1>
  <p data-lake-id="udcebfea7" id="udcebfea7"><br></p>
  <p data-lake-id="u9a32da89" id="u9a32da89"><span data-lake-id="u19884c2a" id="u19884c2a">RabbitMQ可以通过多种方式来实现高可用性，以确保在硬件故障或其他不可预测的情况下，消息队列系统仍然能够正常运行。RabbitMQ有三种模式：单机模式、普通集群模式、镜像集群模式。</span></p>
  <p data-lake-id="u0ecdf4ad" id="u0ecdf4ad"><span data-lake-id="u54c29aac" id="u54c29aac">​</span><br></p>
  <p data-lake-id="uc3c33de9" id="uc3c33de9"><span data-lake-id="u477de922" id="u477de922">其中单机模式一般用于demo搭建，不适合在生产环境中使用。剩下的集群模式和镜像模式都可以帮助我们实现不同程度的高可用。</span></p>
  <p data-lake-id="u1c59ab2f" id="u1c59ab2f"><span data-lake-id="ud782a170" id="ud782a170">​</span><br></p>
  <p data-lake-id="u70bb5d40" id="u70bb5d40"><strong><span data-lake-id="ua0d337e1" id="ua0d337e1">普通集群模式</span></strong></p>
  <p data-lake-id="uf7baaf64" id="uf7baaf64"><br></p>
  <p data-lake-id="u49c602b7" id="u49c602b7"><span data-lake-id="u036faf43" id="u036faf43">普通集群模式，就是将 RabbitMQ 实例部署到多台服务器上，多个实例之间协同工作，共享队列和交换机的元数据，并通过内部通信协议来协调消息的传递和管理。</span></p>
  <p data-lake-id="ufb7cb08d" id="ufb7cb08d"><span data-lake-id="u95c62e33" id="u95c62e33">​</span><br></p>
  <p data-lake-id="uf4d3d4f2" id="uf4d3d4f2"><span data-lake-id="uaf82fdd0" id="uaf82fdd0">在这种模式下，我们创建的Queue，它的元数据（配置信息）会在集群中的所有实例间进行同步，但是队列中的消息只会存在于一个 RabbitMQ 实例上，而不会同步到其他队列。</span></p>
  <p data-lake-id="u7967473f" id="u7967473f"><span data-lake-id="u2f9b48a7" id="u2f9b48a7">​</span><br></p>
  <p data-lake-id="uc7f8dbb2" id="uc7f8dbb2"><img src="https://cdn.nlark.com/yuque/0/2023/png/5378072/1693630663836-60ce6ae3-fa52-4d00-a7e4-94a3e651d014.png?x-oss-process=image%2Fwatermark%2Ctype_d3F5LW1pY3JvaGVp%2Csize_25%2Ctext_SmF2YSA4IEd1IFA%3D%2Ccolor_FFFFFF%2Cshadow_50%2Ct_80%2Cg_se%2Cx_10%2Cy_10"></p>
  <p data-lake-id="u8cb3aeef" id="u8cb3aeef"><span data-lake-id="u484e7da3" id="u484e7da3">​</span><br></p>
  <p data-lake-id="u648ad6de" id="u648ad6de"><span data-lake-id="u80154d03" id="u80154d03">当我们消费消息的时候，如果消费者连接到了未保存消息的实例，那么那个实例会通过元数据定位到消息所在的实例，拉取数据过来发送给消费者进行消费。</span></p>
  <p data-lake-id="ueb2e5ece" id="ueb2e5ece"><span data-lake-id="u3a73c03b" id="u3a73c03b">​</span><br></p>
  <p data-lake-id="ub3d1a387" id="ub3d1a387"><span data-lake-id="u4687a35b" id="u4687a35b">消息的发送也是一样的，当发送者连接到了一个不保存消息的实例时，也会被转发到保存消息的实例上进行写操作。</span></p>
  <p data-lake-id="u7a7b9542" id="u7a7b9542"><span data-lake-id="u47012bf4" id="u47012bf4">​</span><br></p>
  <p data-lake-id="u487756b6" id="u487756b6"><span data-lake-id="u8f5f381c" id="u8f5f381c">这种集群模式下，每一个实例中的元数据是一样的，大家都是完整的数据。但是队列中的消息数据，在不同的实例上保存的是不一样的。这样通过增加实例的方式就可以提升整个集群的消息存储量，以及性能。</span></p>
  <p data-lake-id="uf647187a" id="uf647187a"><span data-lake-id="ub75e6498" id="ub75e6498">​</span><br></p>
  <p data-lake-id="ubfb243a5" id="ubfb243a5"><span data-lake-id="ufc6df123" id="ufc6df123">这种方式在高可用上有一定的帮助，不至于一个节点挂了就全都挂了。但是也还有缺点，至少这个实例上的数据是没办法被读写了。</span></p>
  <p data-lake-id="u3247f19d" id="u3247f19d"><span data-lake-id="ubc30d034" id="ubc30d034">​</span><br></p>
  <p data-lake-id="u57f65e40" id="u57f65e40"><strong><span data-lake-id="u690a8157" id="u690a8157">镜像模式</span></strong></p>
  <p data-lake-id="u7d731a01" id="u7d731a01"><strong><span data-lake-id="u6aeadbdc" id="u6aeadbdc">​</span></strong><br></p>
  <p data-lake-id="u4a8ee9b1" id="u4a8ee9b1"><span data-lake-id="u64c512e3" id="u64c512e3">顾名思义，就是每一台RabbitMQ都像一个镜像一样，存储的内容都是一样的。这种模式下，Queue的元数据和消息数据不再是单独存储在某个实例上，而是集群中的所有实例上都存储一份。</span></p>
  <p data-lake-id="u22063fa5" id="u22063fa5"><span data-lake-id="ue187694d" id="ue187694d">​</span><br></p>
  <p data-lake-id="u81d9217d" id="u81d9217d"><span data-lake-id="u2e310937" id="u2e310937">这样每次在消息写入的时候，就需要在集群中的所有实例上都同步一份，这样即使有一台实例发生故障，剩余的实例也可以正常提供完整的数据和服务。</span></p>
  <p data-lake-id="u2afb7f70" id="u2afb7f70"><span data-lake-id="ucb263a16" id="ucb263a16">​</span><br></p>
  <p data-lake-id="ub938e783" id="ub938e783"><img src="https://cdn.nlark.com/yuque/0/2023/png/5378072/1693632006996-be3d598e-1320-4aee-ba0a-07c8667e577c.png?x-oss-process=image%2Fwatermark%2Ctype_d3F5LW1pY3JvaGVp%2Csize_24%2Ctext_SmF2YSA4IEd1IFA%3D%2Ccolor_FFFFFF%2Cshadow_50%2Ct_80%2Cg_se%2Cx_10%2Cy_10"></p>
  <p data-lake-id="ub550ce09" id="ub550ce09"><br></p>
  <p data-lake-id="ub3d66e53" id="ub3d66e53"><span data-lake-id="u35cb08d8" id="u35cb08d8">这种模式下，就保障了RabbitMQ的高可用。</span></p>
 </body>
</html>